﻿namespace AlgoHero.Modelo
{
    using System;    
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Collections.Generic;
    using System.Windows.Forms;

    public class Tecla
    {
        private Keys key;
        private bool fueApretada;

        public Tecla(Keys unaTecla)
        {
            this.fueApretada = false;
            this.key = unaTecla;            
        }

        public Tecla(char unaTecla)
        {
            this.fueApretada = false;            

            string sTecla = unaTecla.ToString();

            try
            {
                Keys key = (Keys)Enum.Parse(typeof(Keys), sTecla);
                this.key = key;
            }
            catch (ArgumentException)
            {
                Keys key = Keys.None;
                this.key = key;
            }
        }

        public Tecla(XmlElement nodo)
        {
            this.fueApretada = false;

            string sKey = nodo.Attributes.GetNamedItem("valor").Value;
            Keys key = (Keys)Enum.Parse(typeof(Keys), sKey);

            this.key = key;            
        }
        

        public Tecla Copy()
        {            
            Tecla teclaADevolver = new Tecla(this.key);
            
            return teclaADevolver;
        }
            

        internal void SerializarEn(XmlDocument documento, XmlNode nodoPadre)
        {   
            XmlNode nodoTecla = documento.CreateNode(XmlNodeType.Element, "Tecla", "");

            XmlAttribute attValor = documento.CreateAttribute("valor");
            attValor.Value = this.key.ToString();

            nodoTecla.Attributes.Append(attValor);

            nodoPadre.AppendChild(nodoTecla);            
        }

        public override bool Equals(object obj)
        {
            Tecla otraTecla;

            try
            {
                otraTecla = (Tecla)obj;
                return (this == otraTecla);
            }
            catch
            {
                return false;
            }
        }        

        public static bool operator ==(Tecla unaTecla, Tecla otraTecla)
        {
            return ((unaTecla.key == otraTecla.key));            
        }

        public static bool operator !=(Tecla unaTecla, Tecla otraTecla)
        {
            return !(unaTecla == otraTecla);
        }

        public Keys Valor
        {
            get { return this.key; }
        }

        public bool FueApretada
        {
            get { return fueApretada; }
            set { this.fueApretada = value; }
        }

        public static IEqualityComparer<Tecla> GetEqualityComparer()
        {
            IEqualityComparer<Tecla> comparador = new TeclaEqualityComparer();

            return comparador;
        }

        //Comparador de teclas utilizado para comparar en las colecciones
        private class TeclaEqualityComparer : IEqualityComparer<Tecla>
        {
            public bool Equals(Tecla unaTecla, Tecla otraTecla)
            {
                return (unaTecla.Valor == otraTecla.Valor);
            }

            //Esto hay que agregarlo para que compile. 
            public int GetHashCode(Tecla tecla)
            {
                return tecla.Valor.GetHashCode();                
            }
        }
        
    }
}